﻿<META content="text/html;charest=GB2312" http-equiv=Content-Type>
<html>
<body onload="load()"><!--在onload事件中处理事件插拨及检查是否已经安装了客户端服务程序-->

<h3>您尚未安装KEY的驱动程序</h3>
<h2>欢迎***登录双招双引系统</h2>0


<script src="assets/app/js/Syunew3.js"></script><!--定要包含有我们的UK单元包-->
<script>

var bConnect=0;
function load()
{
    //如果是IE10及以下浏览器，则跳过不处理
    if(navigator.userAgent.indexOf("MSIE")>0 && !navigator.userAgent.indexOf("opera") > -1) return;
    try
    {
        var s_pnp=new SoftKey3W();
        s_pnp.Socket_UK.onopen = function() 
        {
            bConnect=1;//代表已经连接，用于判断是否安装了客户端服务
        } 
        
        //在使用事件插拨时，注意，一定不要关掉Sockey，否则无法监测事件插拨
        s_pnp.Socket_UK.onmessage =function got_packet(Msg) 
        {
            var PnpData = JSON.parse(Msg.data);
            if(PnpData.type=="PnpEvent")//如果是插拨事件处理消息
            {
                if(PnpData.IsIn) 
                {
                        alert("UKEY已被插入，被插入的锁的路径是："+PnpData.DevicePath);
                        console.log(PnpData);
                }
                else
                {
                        alert("UKEY已被拨出，被拨出的锁的路径是："+PnpData.DevicePath);
                }
            }
        } 
        
        s_pnp.Socket_UK.onclose = function()
        {
            
        }
    }
    catch(e)  
    {  
        alert(e.name + ": " + e.message);
        return false;
    }  
}

var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

function toHex( n ) {

        var result = ''
        var start = true;

        for ( var i=32; i>0; ) {
                i -= 4;
                var digit = ( n >> i ) & 0xf;

                if (!start || digit != 0) {
                        start = false;
                        result += digitArray[digit];
                }
        }

        return ( result == '' ? '0' : result );
}
function login_onclick() 
{
    //如果是IE10及以下浏览器，则使用AVCTIVEX控件的方式
    if(navigator.userAgent.indexOf("MSIE")>0 && !navigator.userAgent.indexOf("opera") > -1) return Handle_IE10();
    
    //判断是否安装了服务程序，如果没有安装提示用户安装
    if(bConnect==0)
    {
        window.alert ( "你尚未安装服务端。");return false;
    }
	try
	{
			var DevicePath,mylen,ret,keyid,username,mykey,outstring,address,mydata,i,InString,versionex,version;
			var PubKeyX,PubKeyY,PriKey,UserName,Pin;
			
		//由于是使用事件消息的方式与服务程序进行通讯，
        //好处是不用安装插件，不分系统及版本，控件也不会被拦截，同时安装服务程序后，可以立即使用，不用重启浏览器
        //不好的地方，就是但写代码会复杂一些
        var s_simnew1=new SoftKey3W(); //创建UK类
			
		s_simnew1.Socket_UK.onopen = function() {
            s_simnew1.ResetOrder();//这里调用ResetOrder将计数清零，这样，消息处理处就会收到0序号的消息，通过计数及序号的方式，从而生产流程
	    } 
		    
		//写代码时一定要注意，每调用我们的一个UKEY函数，就会生产一个计数，即增加一个序号，较好的逻辑是一个序号的消息处理中，只调用我们一个UKEY的函数
	    s_simnew1.Socket_UK.onmessage =function got_packet(Msg) 
	    {
	        var UK_Data = JSON.parse(Msg.data);
	        if(UK_Data.type!="Process")return ;//如果不是流程处理消息，则跳过
	        //alert(Msg.data);
	        switch(UK_Data.order) 
	        {
	            case 0:
	                {
	                    s_simnew1.FindPort(0);//查找加密锁
	                }
	                break;//!!!!!重要提示，如果在调试中，发现代码不对，一定要注意，是不是少了break,这个少了是很常见的错误
	            case 1:
	                {
	                    if( UK_Data.LastError!=0){window.alert ( "未发现加密锁，请插入加密锁");s_simnew1.Socket_UK.close();return false;} 
	                    DevicePath=UK_Data.return_value;//获得返回的UK的路径
	                    s_simnew1.GetChipID(DevicePath);//返回芯片唯一ID
	                }
	                break;	    
                case 2:
	                {
	                    if( UK_Data.LastError!=0){window.alert("返回芯片唯一ID时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        outstring = UK_Data.return_value;
                        window.alert("已成功返回芯片唯一ID：" + outstring);
                        s_simnew1.YtSetPin("123","123",DevicePath); //设置Pin码,使用默认的PIN码
	                }
	                break;	            
                case 3:
	                {
	                    if( UK_Data.LastError!=0){window.alert("设置Pin码时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
	                    window.alert("已成功设置了设置Pin码." );
	                    
	                    //对数据进行签名
                        Pin="123" //使用默认的PIN码
	                    s_simnew1.YtSign("加密锁",Pin,DevicePath);
	                }
	                break;	
                case 4:
	                {
	                    if( UK_Data.LastError!=0){window.alert("对数据进行签名时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        outstring = UK_Data.return_value;
                        window.alert("已成功对数据进行签名，签名后的数据是：" + outstring);
                        
                        //对数据进行加密
                        s_simnew1.SM2_EncString("加密锁",DevicePath);
	                }
	                break;	
                case 5:
	                {
	                    if( UK_Data.LastError!=0){window.alert("对数据进行加密时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        outstring = UK_Data.return_value;
                        window.alert("已成功对数据进行加密，加密后的数据是：" + outstring);
                        
                        //对数据进行解密,使用默认的PIN码
                        s_simnew1.SM2_DecString(outstring,Pin,DevicePath);
	                }
	                break;	
                case 6:
	                {
	                    if( UK_Data.LastError!=0){window.alert("对数据进行解密时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        outstring = UK_Data.return_value;
                        window.alert("已成功对数据进行解密，解密后的数据是：" + outstring);
                        
                        //产生密钥对
                        s_simnew1.StarGenKeyPair(DevicePath);
	                }
	                break;	
                case 7:
	                {
	                    if( UK_Data.LastError!=0){window.alert("产生密钥对出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
	                    
	                    //获取生成的私钥
	                    s_simnew1.GenPriKey();

	                }
	                break;	
                case 8:
	                {
	                    if( UK_Data.LastError!=0){window.alert("获取生成的私钥时错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        PriKey=UK_Data.return_value;
                        
                        //获取生成的公钥X
	                    s_simnew1.GenPubKeyX();
	                }
	                break;	
                case 9:
	                {
	                    if( UK_Data.LastError!=0){window.alert("获取生成的公钥X时错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
	                    PubKeyX=UK_Data.return_value;
	                    
	                    //获取生成的公钥Y
	                    s_simnew1.GenPubKeyY();

	                }
	                break;		
                case 10:
	                {
	                    if( UK_Data.LastError!=0){window.alert("获取生成的公钥Y时错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
	                    PubKeyY=UK_Data.return_value;
                        
                        //设置密钥对及用户身份到锁中
                        UserName="xxx公司";
                        s_simnew1.Set_SM2_KeyPair(PriKey,PubKeyX,PubKeyY,UserName,DevicePath);
	                }
	                break;	
                case 11:
	                {
	                    if( UK_Data.LastError!=0){window.alert("设置密钥对及用户身份时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        window.alert("已成功设置密钥对及用户身份." );
                        
                        //返回设置在锁中的公钥X
                        s_simnew1.GetPubKeyX(DevicePath);
	                }
	                break;	
                case 12:
	                {
	                    if( UK_Data.LastError!=0){window.alert("返回设置在锁中的公钥X时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
                        outstring = UK_Data.return_value;
                        window.alert("已成功返回设置在锁中的公钥X：" + outstring);
                        
                        //返回设置在锁中的公钥Y
                        s_simnew1.GetPubKeyY(DevicePath);
	                }
	                break;	
                case 13:
	                {
	                    if( UK_Data.LastError!=0){window.alert("返回设置在锁中的公钥Y时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
	                    outstring =UK_Data.return_value;
                        window.alert("已成功返回设置在锁中的公钥Y：" + outstring);
                        
                        //返回设置在锁中的身份
                        s_simnew1.GetSm2UserName(DevicePath);
	                }
	                break;		
                case 14:
	                {
	                    if( UK_Data.LastError!=0){window.alert("返回设置在锁中的用户身份时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;} 
	                    outstring =UK_Data.return_value;
                        window.alert("已成功返回设置在锁中的用户身份：" + outstring);
                        
                        
                        //所有工作处理完成后，关掉Socket
                        s_simnew1.Socket_UK.close();
	                }
	                break;	                	                	                	                	                	                                                	                	                	                	                
            }
        }
    	    
        s_simnew1.Socket_UK.onclose = function(){

        }
        return true;
    }

    catch(e)  
    {  
		alert(e.name + ": " + e.message);
		return false;
    }  

}

function Handle_IE10() 
{

    try
    {
		var DevicePath,mylen,ret,keyid,username,mykey,outstring,address,mydata,i,InString,versionex,version;
		var PubKeyX,PubKeyY,PriKey,UserName,Pin;
			
		//创建控件
		s_simnew1=new ActiveXObject("Syunew3A.s_simnew3");
    
		DevicePath = s_simnew1.FindPort(0);//'查找加密锁
		if( s_simnew1.LastError!= 0 )
		{
				window.alert ( "未发现加密锁，请插入加密锁");return false;
		}
		else
		{
                //返回芯片唯一ID
        {
        outstring = s_simnew1.GetChipID(DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("返回芯片唯一ID时出现错误"); return; }
            window.alert("已成功返回芯片唯一ID：" + outstring);
        }
        //设置Pin码
        {
            ret = s_simnew1.YtSetPin("123","123",DevicePath);
            if (ret != 0) { window.alert("设置Pin码时出现错误"); return; }
            window.alert("已成功设置了设置Pin码." );
        }
        //使用默认的PIN码
            Pin="123"
        //对数据进行签名
        {
            outstring = s_simnew1.YtSign("加密锁",Pin,DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("对数据进行签名时出现错误"); return; }
            window.alert("已成功对数据进行签名：" + outstring);
        }
        //对数据进行加密
        {
            outstring = s_simnew1.SM2_EncString("加密锁",DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("对数据进行加密时出现错误"); return; }
            window.alert("已成功对数据进行加密：" + outstring);
        }
        //对数据进行解密,使用默认的PIN码
        {
            outstring = s_simnew1.SM2_DecString(outstring,Pin,DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("对数据进行解时出现错误"); return; }
            window.alert("已成功对数据进行解密：" + outstring);
        }
        
            //产生密钥对
        {
            ret = s_simnew1.StarGenKeyPair(DevicePath);
            if (ret!= 0) { window.alert("产生密钥对出现错误"); return; }
            
            PriKey=s_simnew1.GenPriKey;
            window.alert("已成功返回生成的私钥：" + PriKey);
            
            PubKeyX=s_simnew1.GenPubKeyX;
            window.alert("已成功返回生成的公钥X：" + PubKeyX);
            
            PubKeyY=s_simnew1.GenPubKeyY;
            window.alert("已成功返回生成的公钥Y：" + PubKeyY);
        }
        
        //对设置密钥对及用户身份
	        UserName="xxx公司";
        {
            ret = s_simnew1.Set_SM2_KeyPair(PriKey,PubKeyX,PubKeyY,UserName,DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("设置密钥对及用户身份时出现错误"); return; }
            window.alert("已成功设置密钥对及用户身份." );
        }
        //返回设置在锁中的公钥X
        {
            outstring = s_simnew1.GetPubKeyX(DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("返回设置在锁中的公钥X时出现错误"); return; }
            window.alert("已成功返回设置在锁中的公钥X：" + outstring);
        }
        //返回设置在锁中的公钥Y
        {
            outstring = s_simnew1.GetPubKeyY(DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("返回设置在锁中的公钥Y时出现错误"); return; }
            window.alert("已成功返回设置在锁中的公钥Y：" + outstring);
        }
        //返回设置在锁中的身份
        {
            outstring = s_simnew1.GetSm2UserName(DevicePath);
            if (s_simnew1.LastError != 0) { window.alert("返回设置在锁中的身份时出现错误"); return; }
            window.alert("已成功返回设置在锁中的身份：" + outstring);
        }
        
        }
			return true;
    }

    catch(e)  
    {  
		alert(e.name + ": " + e.message);
		return false;
    }  

}

</SCRIPT>

<input type=button value="对锁进行操作" onclick='login_onclick()'>

</form>

</html>
</body>

